안드로이드 SQLite

1. 프로젝트 생성

  • File → New → Android Project → DBBasic

1.1 엑티비티 구성 기본 파일

엑티비티엑티비티 자바 클래스DB 연결레이아웃리소스파일
고객목록CustomerListActivity.javaDBManager.javaactivity_customer_list.xmlstrings.xml
고객등록CustomerJoinActivity.javaDBManager.javaactivity_customer_join.xmlstrings.xml

1.2 strings.xml

  • app_name, r_text 입력

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">고객관리</string>
    <string name="b_join">등록</string>
    <string name="b_list">목록</string>
    <string name="act_join_form">고객등록</string>
    <string name="menu_settings">Settings</string>
	
	<!-- 등록폼에 사용되는 라벨 -->
	<string name="name">성명</string>
	<string name="gender">성별</string>
	<string name="receive">수신여부</string>
	
</resources>

2. DB 연결

  • DB 연결 기능을 담당하는 DBManager.java 생성
  • DBManager 클래스는 SQLiteOpenHelper 클래스로부터 테이터베이스와 테이블을 관리하는 메소드를 상속받는다.

package com.example.dbbasic;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBManager extends SQLiteOpenHelper {
	
	public DBManager(Context context){
		//DB를 생성 (이미 생성된 경우 생성되지 않음)
		super(context, "myDB", null, 1);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		//테이블 생성 (이미 생성된 경우 생성되지 않음)
		db.execSQL("create table customers (name text, gender text, sms text);");
		
	}

	@Override
	public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
		// TODO Auto-generated method stub
		//존재하는 DB와 버전이 다른 경우
		
	}

}

3. 고객 등록

3.1 고객 등록 layout

  • activity_customer_join.xml
  • 성명, 성별, 수신여부등의 등록 폼

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    
    <!-- 성명 입력을 위한 폼 구성요소 시작 -->
    <LinearLayout
        android:orientation="horizontal"
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content">
        
        <TextView 
            android:layout_width="60sp"
            android:layout_height="wrap_content"
            android:text="@string/name" />
        
        <EditText 
            android:id="@+id/edit_name"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
    
    <!-- 성별 선택 영역 -->
    <LinearLayout
        android:orientation="horizontal"
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content">
        
        <TextView 
            android:layout_width="60sp"
            android:layout_height="wrap_content"
            android:text="@string/gender"/>
        
	    <RadioGroup 
	        android:id="@+id/radiogroup_gender"
	        android:layout_width="fill_parent"
	    	android:layout_height="wrap_content"
	    	android:orientation="horizontal">
	        
	        <RadioButton 
	            android:id="@+id/radio_male"
	            android:layout_width="wrap_content"
	    	    android:layout_height="wrap_content"
	    	    android:text="남" />
	        
	        <RadioButton 
	            android:id="@+id/radio_female"
	            android:layout_width="wrap_content"
	    	    android:layout_height="wrap_content"
	    	    android:text="여" />
	        
	    </RadioGroup>
    </LinearLayout>
    
    <!-- 수신여부 선택 영역 -->
    <LinearLayout
        android:orientation="horizontal"
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content">
        
        <TextView 
            android:layout_width="60sp"
            android:layout_height="wrap_content"
            android:text="@string/receive" />
        
        <CheckBox 
            android:id="@+id/check_sms"
            android:layout_width="wrap_content"
    	    android:layout_height="wrap_content"
    	    android:text="SMS"/>
    </LinearLayout>
    
    <!-- 버튼 -->
    <LinearLayout
        android:orientation="horizontal"
        android:gravity="right"
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content">
        
        <!-- 등록버튼 -->
	    <Button 
	        android:id="@+id/button_join"
	        android:layout_width="wrap_content"
	    	android:layout_height="wrap_content" 
	    	android:text="@string/b_join" />
	    
	    <!-- 목록버튼 -->
	    <Button 
	        android:id="@+id/button_list"
	        android:layout_width="wrap_content"
	    	android:layout_height="wrap_content" 
	    	android:text="@string/b_list" />
    </LinearLayout>
</LinearLayout>

3.2 고객 등록 Activity

  • 회원정보 등록을 처리하는 CustomerJoinActivity.java 생성

package com.example.dbbasic;

import android.app.Activity;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioGroup;

public class CustomerJoinActivity extends Activity implements OnClickListener {
	private DBManager dbMgr;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_customer_join);
		setTitle("고객등록");

		// 등록버튼 onClick() 메소드 실행
		Button btnJoin = (Button) findViewById(R.id.button_join);
		btnJoin.setOnClickListener(this);

		// 목록버튼 onClick() 메소드 실행
		Button btnList = (Button) findViewById(R.id.button_list);
		btnList.setOnClickListener(this);
	}

	@Override
	public void onClick(View view) {

		// 목록 버튼을 클릭한 경우
		if (view.getId() == R.id.button_list) {
			Intent intent = new Intent(this, CustomerListActivity.class);

			// 인텐트에서 지정한 엑티비티 실행
			startActivity(intent);

			// 현재 엑티비티 종료
			finish();
		}

		// 성명 추출
		EditText edName = (EditText) findViewById(R.id.edit_name);
		String strName = edName.getText().toString();

		// 성별 추출
		RadioGroup rgGender = (RadioGroup) findViewById(R.id.radiogroup_gender);
		String strGender = "남";

		if (rgGender.getCheckedRadioButtonId() == R.id.radio_female) {
			strGender = "여";
		}

		// SMS 수신여부
		CheckBox chkSms = (CheckBox) findViewById(R.id.check_sms);
		String strSms = "N";

		if (chkSms.isChecked()) {
			strSms = (String) chkSms.getText();
		}

		dbMgr = new DBManager(this);

		try {

			SQLiteDatabase sdb = dbMgr.getWritableDatabase();
			StringBuffer sql = new StringBuffer();
			sql.append("INSERT INTO customers VALUES(");
			sql.append("'" + strName + "',");
			sql.append("'" + strGender + "',");
			sql.append("'" + strSms + "');");
			sdb.execSQL(sql.toString());

		} catch (SQLiteException e) {

		} finally {
			dbMgr.close();
		}

		Intent intent = new Intent(this, CustomerListActivity.class);

		// 인텐트에서 지정한 엑티비티 실행
		startActivity(intent);

		// 현재 엑티비티 종료
		finish();
	}
}


4. 고객목록

4.1 고객 목록 layout

  • activity_customer_list.xml
  • 조회영역과 등록버튼으로 구성됨

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    
    <LinearLayout
        android:id="@+id/customers"
        android:orientation="vertical"
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content">
        
    </LinearLayout>
    
    <Button 
        android:id="@+id/button_join_form"
        android:layout_width="wrap_content"
    	android:layout_height="wrap_content" 
    	android:text="@string/b_join" />
    
</LinearLayout>

4.2 고객 목록 Activity

  • 고객정보를 조회하는 CustomerListActivity.java 생성

package com.example.dbbasic;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class CustomerListActivity extends Activity implements OnClickListener {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_customer_list);

		// 엑티비티 라벨 출력
		setTitle("고객목록");

		// 고객정보를 추가할 레이아웃을 인식
		LinearLayout layout = (LinearLayout) findViewById(R.id.customers);

		int i = 0;

		try {

			DBManager dbMgr = new DBManager(this);

			// DB 연결
			SQLiteDatabase db = dbMgr.getReadableDatabase();

			Cursor cursor = db.rawQuery(
					"SELECT name, gender, sms FROM customers", null);

			while (cursor.moveToNext()) {
				String name = cursor.getString(0);
				String gender = cursor.getString(1);
				String sms = cursor.getString(2);

				// 레이아웃에 추가할 고객정보를 위한 텍스트뷰 생성
				TextView nameTextView = new TextView(this);
				nameTextView.append(name);
				nameTextView.setTextSize(20);
				nameTextView.setTextColor(Color.rgb(255, 255, 0));

				// 고객성명을 레이아웃에 추가하여 출력
				layout.addView(nameTextView);

				// 성별과 SMS 수신여부를 위한 텍스트 뷰
				TextView gsTextView = new TextView(this);
				gsTextView.append(gender + "\n");
				gsTextView.append(sms + "\n");

				// 고객정보를 레이아웃에 추가하여 출력
				layout.addView(gsTextView);
				i++;
			}

			if (i == 0) {
				TextView defaultTextView = new TextView(this);
				defaultTextView.append("등록된 고객이 없습니다.!");
				layout.addView(defaultTextView);
			}

			// 리소스 반환
			cursor.close();
			dbMgr.close();

		} catch (SQLiteException e) {
			TextView errorTextView = new TextView(this);
			errorTextView.append("db 접속 에러가 발생했습니다!");
			layout.addView(errorTextView);
		}

		Button btn = (Button) findViewById(R.id.button_join_form);

		// 등록버튼 클릭대기
		btn.setOnClickListener(this);
	}

	/**
	 * 등록을 위해 CustomerRegActivity.class 먼저 구현한다.
	 */
	@Override
	public void onClick(View v) {
		// 등록 버튼이 클릭되었을 때
		Intent it = new Intent(this, CustomerJoinActivity.class);
		startActivity(it);
		finish();
	}
}


5. AndroidManifest.xml 편집


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.dbbasic"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="15"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.dbbasic.CustomerListActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <activity
            android:name="com.example.dbbasic.CustomerJoinActivity"
            android:label="@string/act_join_form" >
            
       </activity>
    </application>

</manifest>